HDU 5428 [The Factor] 分解质因数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5428

题目大意:给你若干个整数,让你输出这些数乘积的一个最小因子,并且这个因子至少有3个因子。

关键思想:分解质因数,我们要找的其实就是两个最小质因数的乘积。我的算法关键就是维护最小的两个质因数。

代码如下:

#include <iostream>
#include <cmath> 
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAXN=105;
int min1,min2;

void PrimeFac(int n){//分解质因数 
    bool flag=false;
    for(int i=2;i<=n;i++){
        while(n!=i){
            if(n%i==0){ 
                if(min1>min2)min1=min(i,min1);
                else min2=min(i,min2);
                n/=i;
            }else break;
        }
        if(i>=max(min1,min2)){
            return;
        }
    }
    if(min1>min2)min1=min(n,min1);
    else min2=min(n,min2);
    return;
} 

bool isPrime(int n){
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0)return false;
    }
    return true;
}

int main(){
    int T,n,tmp,ans;
    scanf("%d",&T);
    while(T--){
        min1=inf,min2=inf;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&tmp);
            if(tmp==1)continue; 
            if(isPrime(tmp)){
                if(min1>min2)min1=min(tmp,min1);
                else min2=min(tmp,min2);    
            }else
                PrimeFac(tmp);
        }
        if(min1==inf||min2==inf)printf("-1\n");
        else printf("%lld\n",(long long)min1*min2);//结果可能超出int范围,WA了几发 
    }
    return 0;
}

 

posted @ 2017-08-29 19:34  哇咔咔咔  阅读(218)  评论(0编辑  收藏  举报